10991. Регион
Три
окружности с радиусами r1,
r2 и r3 попарно касаются друг друга. Найти площадь области G,
которая находится между окружностями.
Вход. Первая
строка содержит количество тестов. Каждый тест состоит из одной строки,
содержащей радиусы окружностей r1,
r2 и r3.
Выход. Для каждого теста вывести площадь
области между окружностями G, округленной до шести знаков после десятичной
точки.
2
5.70 1.00 7.89
478.61 759.84
28.36
Пример выхода
1.2243
2361.0058
геометрия
Пусть O1, O2,
O3 – центры окружностей. Построим треугольник O1O2O3.
Площадь области G найдем как
разность площади треугольника O1O2O3 и трех
секторов с радиусами r1, r2 , r3. Площадь треугольника O1O2O3
находим по формуле Герона (полупериметр p
равен сумме радиусов окружностей r1
+ r2 + r3):
S = =
Площадь сектора находится по углу
a и радиусу r по формуле
S = ra
Углы треугольника O1O2O3
находятся по теореме косинусов. Если a –
угол, лежащий против стороны длины r2
+ r3, то
(r2 + r3)2
= (r1 + r3)2 + (r1 + r2)2 – 2(r1
+ r3) (r1 + r2) cos a
Откуда находится угол a.
Функция geron вычисляет площадь
треугольника O1O2O3.
double geron(double
r1,double r2,double
r3)
{
double
result;
result = (r1 + r2 + r3) * r1 * r2 * r3;
return
sqrt(result);
}
Функция angle вычисляет угол
треугольника O1O2O3, лежащий против стороны
длины r2 + r3. Угол находится из теоремы
косинусов.
double angle(double
r1,double r2,double
r3)
{
double a =
((r1+r3) * (r1+r3) + (r1+r2) * (r1+r2) - (r2+r3) * (r2+r3)) /
(2 * (r1+r3) * (r1+r2));
return
acos(a);
}
Функция squaresector вычисляет
площадь сектора с радиусом r и углом a.
double squaresector(double r, double a)
{
return r * r
* a / 2;
}
Искомая площадь области G
находится как разность площади треугольника O1O2O3
и трех секторов с радиусами r1,
r2 , r3.
double square(void)
{
double res =
geron(r1,r2,r3);
res -= squaresector(r1,angle(r1,r2,r3));
res -= squaresector(r2,angle(r2,r1,r3));
res -= squaresector(r3,angle(r3,r1,r2));
return res;
}
Основной цикл программы. Читаем
значения радиусов трех окружностей, вычисляем и печатаем искомую площадь.
scanf("%d",&tests);
while(tests--)
{
scanf("%lf
%lf %lf", &r1, &r2, &r3);
printf("%.6lf\n",square());
}